{....A, ...B} と & を区別する
罠っぽいが、当然の挙動
以下のような2つの型があったとき
code:ts
type Foo = { a: number };
type Bar = { b: string; c: boolean };
これらを結合した型を書きたい
以下は同じ意味になる
code:ts
type A1 = { a: number; b: string; c: boolean };
type A2 = Foo & Bar;
ここまでは良い
ここまでの話なら、&と{...A, ...B}は等しいものと見なされるべき!という気持ちになる
問題は、propertyがコンフリクトしたとき
code:ts
type Foo = { a: number; c: number };
type Bar = { b: string; c: boolean };
cが被っているが、それぞれ別の型になっている
これを「結合」したときにどういう型になるのが自然か?
この「結合」という言葉遣いが曖昧であることに注意する
1 「結合」とはmergeのことである
JSの{...A, ...B}的なやつ
propertyがコンフリクトした場合は、後者の方を優先する
code:ts
type C = { a: number; b: string: c: boolean }
2 「結合」とはIntersectoinのことである
code:ts
type B = { a: number; b: string; c: number & boolean }
cは、numberかつbooleanであるような型
当然、そのような集合に属する値は存在しないのでc: neverになる
code:ts
type B = { a: number; b: string; c: never }